#ifndef AST_ASSIGNMENT
#define AST_ASSIGNMENT
#include <string>
#include "node.h"

namespace AST {

    /**
     * Atribuição
     *
     * Uma atribuição é um comando que pode ser executado em uma linguagem de
     * programação, onde o resultado da expressão à direita é inferido em
     * memória na posição informada na esquerda do comando. Portanto, temos como
     * parâmetro à esquerda uma variável ou vetor e à direita temos uma
     * expressão.
     *
     * @category AST
     * @package  AST
     */
    class Assignment : public Node {

    private:

        /**
         * Identificador para Atribuição
         */
        Node* _identifier;

        /**
         * Resultado para Atribuição
         */
        Node* _expression;

        /**
         * Configuração do Identificador
         *
         * Um identificador é uma variável ou vetor que pode receber um valor em
         * memória conforme resultado da expressão relacionada na atribuição.
         * Este identificador é o elemento da esquerda do comando.
         *
         * @param  Node*       Elemento Identificador
         * @return Assignment* Próprio Objeto para Encadeamento
         */
        Assignment* _setIdentifier(Node*);

        /**
         * Configuração de Expressão
         *
         * Expressão que gera o resultado que deve ser armazenado no
         * identificador relacionado na atribuição. Esta expressão pode ser
         * qualquer elemento utilizado na gramática, caracterizando assim um nó
         * da árvore abstrata de sintaxe.
         *
         * @param  Node*       Elemento Representante da Expressão
         * @return Assignment* Próprio Objeto para Encadeamento
         */
        Assignment* _setExpression(Node*);

    public:

        /**
         * Construtor Padrão
         *
         * Método utilizado para construção de objetos com base nesta estrutura,
         * responsáveis pela representação de atribuições na linguagem. Recebem
         * como parâmetros dois nós de árvore abstrata de sintaxe que
         * representam o identificador de memória, seja ele uma variável ou um
         * vetor, à esquerda; e uma expressão que apresenta um resultado à
         * direita.
         *
         * @param Node* Identificador da Atribuição
         * @param Node* Expressão para Armazenamento no Identificador
         */
        Assignment(Node*, Node*);

        /**
         * Apresentação do Identificador
         *
         * Exibição do elemento representante do identificador em memória que
         * pode armazenar o resultado da expressão relacionada à direita da
         * atribuição.
         *
         * @return Node* Elemento Solicitado
         */
        Node* getIdentifier();

        /**
         * Apresentação de Expressão
         *
         * Exibição do elemento representante da expressão onde o resultado é
         * atribuido ao identificador relacionado à direita da atribuição.
         *
         * @return Node* Elemento Solicitado
         */
        Node* getExpression();

        // Sobrescrita
        std::string toString(int);

    };

};

#endif

